/**
 * 文件名：SerialPortUtils.java
 *
 * 创建人：Elvin Zhao - 279152260@qq.com
 *
 * 创建时间：2018年7月19日 上午12:57:34
 *
 * 版权所有：FNII
 */
package com.springvision.core.serialport;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.TooManyListenersException;

import com.springvision.yuanfeng.core.YfSerialPortListener;

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.UnsupportedCommOperationException;

/**
 * [描述信息：说明类的基本功能]
 *
 * @author Elvin Zhao - 279152260@qq.com
 * @version 1.0 Created on 2018年7月19日 上午12:57:34
 */
public class SerialPortUtils {

	/**
	 * 列举出本机所有可用串口
	 * 
	 * @return
	 */
	public static Enumeration<CommPortIdentifier> listAllPort() {
		@SuppressWarnings("unchecked")
		/*
		 * 不带参数的getPortIdentifiers方法获得一个枚举对象， 该对象又包含了系统中管理每个端口的CommPortIdentifier对象。注意这里的端口不仅仅是指串口，也包括并口。这个方法还可以带参数
		 * 。getPortIdentifiers(CommPort)获得与已经被应用程序打开的端口相对应的CommPortIdentifier对象。 getPortIdentifier(String
		 * portName)获取指定端口名（比如“COM1”）的CommPortIdentifier对象。
		 */
		Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
		return portList;
	}

	public static List<CommPortIdentifier> listAllPort(int portType) {
		List<CommPortIdentifier> ret = new ArrayList<>();
		Enumeration<CommPortIdentifier> all = listAllPort();
		if (all == null)
			return ret;
		while (all.hasMoreElements()) {
			CommPortIdentifier portId = (CommPortIdentifier) all.nextElement();
			if (portId.getPortType() == portType) {
				ret.add(portId);
			}
		}
		return ret;
	}

	public static List<CommPortIdentifier> listAllSerialPort() {
		return listAllPort(CommPortIdentifier.PORT_SERIAL);/* getPortType方法返回端口类型 */
	}

	// 获取串口
	public static CommPortIdentifier getSerialPort(String portName) {
		List<CommPortIdentifier> list = listAllSerialPort();
		if (list == null)
			return null;
		for (CommPortIdentifier p : list) {
//			System.err.println(p.getName());
			if (p.getName().equalsIgnoreCase(portName)) {
				return p;
			}
		}
		return null;
	}

	public static void main(String[] args)
			throws IOException, UnsupportedCommOperationException, TooManyListenersException, PortInUseException {
		System.err.println("---------------------------------------------------");
		System.err.println("---------------------------------------------------");
		System.err.println("---------------------------------------------------");
		System.err.println("---------------------------------------------------");
		System.err.println("---------------------------------------------------");
		// COM1串口发送数据，在COM2--串口调试工具 接收数据
		// 监听串口COM2读
		CommPortIdentifier port = SerialPortUtils.getSerialPort("COM2");
		System.out.println(port.getName());
		YfSerialPortListener listener = new YfSerialPortListener(port);
		listener.initAndOpen();
	}
}
